package com.wtx.fitness.mapper;

import com.wtx.fitness.entity.Score;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 成绩Mapper接口
 */
@Mapper
public interface ScoreMapper {
  /**
   * 查询所有成绩
   */
  List<Score> selectAll();

  /**
   * 根据ID查询成绩
   */
  Score selectById(Integer id);

  /**
   * 根据学生ID查询其所有成绩
   */
  List<Score> selectByStuId(String stuId);

  /**
   * 根据项目ID查询所有成绩
   */
  List<Score> selectByItemId(Integer itemId);

  /**
   * 根据项目ID查询所有成绩（Map格式）
   */
  List<Map<String, Object>> selectByItemIdAsMap(Integer itemId);

  /**
   * 查询性别分组的合格率
   */
  List<Map<String, Object>> selectPassRateByGender();

  /**
   * 统计项目的成绩分布
   */
  List<Map<String, Object>> selectScoreDistribution(Integer itemId);

  /**
   * 新增成绩
   */
  int insert(Score score);

  /**
   * 批量添加成绩
   */
  int batchInsert(@Param("scores") List<Score> scores);

  /**
   * 更新成绩
   */
  int update(Score score);

  /**
   * 删除成绩
   */
  int deleteById(Integer id);

  /**
   * 删除学生所有成绩
   */
  int deleteByStuId(String stuId);

  /**
   * 删除体测项目的所有成绩
   */
  int deleteByItemId(Integer itemId);

  /**
   * 统计成绩总数
   */
  int countAll();

  /**
   * 统计符合合格状态的成绩数
   * 
   * @param passStatus 合格状态（1-合格，0-不合格）
   */
  int countByPassStatus(int passStatus);

  /**
   * 统计有成绩记录的学生数（去重）
   */
  int countDistinctStudents();

  /**
   * 根据性别统计有成绩记录的学生数（去重）
   * 
   * @param gender 性别
   */
  int countDistinctStudentsByGender(String gender);

  /**
   * 根据项目ID统计成绩数
   * 
   * @param itemId 项目ID
   */
  int countByItemId(Integer itemId);

  /**
   * 根据项目ID和合格状态统计成绩数
   * 
   * @param itemId     项目ID
   * @param passStatus 合格状态（1-合格，0-不合格）
   */
  int countByItemIdAndPassStatus(@Param("itemId") Integer itemId, @Param("passStatus") int passStatus);

  /**
   * 根据项目ID和性别统计成绩数
   * 
   * @param itemId 项目ID
   * @param gender 性别
   */
  int countByItemIdAndGender(@Param("itemId") Integer itemId, @Param("gender") String gender);

  /**
   * 根据项目ID、性别和合格状态统计成绩数
   * 
   * @param itemId     项目ID
   * @param gender     性别
   * @param passStatus 合格状态（1-合格，0-不合格）
   */
  int countByItemIdAndGenderAndPassStatus(@Param("itemId") Integer itemId, @Param("gender") String gender,
      @Param("passStatus") int passStatus);

  /**
   * 获取项目按性别分组的平均成绩
   * 
   * @param itemId 项目ID
   * @param gender 性别
   */
  Double getAverageScoreByItemIdAndGender(@Param("itemId") Integer itemId, @Param("gender") String gender);

  /**
   * 统计有合格成绩的学生数量
   */
  int countPassStudents();

  /**
   * 根据项目ID统计通过该项目的学生数量
   */
  int countPassByItemId(Integer itemId);

  /**
   * 按性别分组获取成绩分布
   */
  List<Map<String, Object>> selectScoreDistributionByGender(String gender);

  /**
   * 获取项目的等级分布统计
   */
  List<Map<String, Object>> selectGradeDistributionByItemId(Integer itemId);

  /**
   * 统计所有成绩中的合格率
   * 
   * @return 所有成绩中的合格率（百分比）
   */
  double countOverallPassRate();

  /**
   * 检查学生是否有成绩记录
   * 
   * @param stuId 学生学号
   * @return 有成绩记录返回true，没有返回false
   */
  boolean hasScoresByStuId(String stuId);
}